iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0
AI Engineering

從呼叫 API 到打造 Gateway:LLM 工程化 30 天系列 第 6

Day 06:Prompt 的基本結構:System / User / Assistant

  • 分享至 

  • xImage
  •  

Day 6:Prompt 的基本結構:System / User / Assistant

把 LLM 帶進程式後,難道對 LLM 的操作就結束了嗎?Part 1 說明完「如何與 LLM 交流」,從今天開始進入 Part 2。「如何提升 LLM 回應的品質」,將是本章節的焦點。

談到提升品質,很多人直覺會想到換上參數更大、能力更好的模型,或者是搜集資料做微調(fine-tune),但事實上並不是所有使用者都能負擔升級的成本。在有限的資源下,透過系統化的 prompt 設計與工程化技巧,不花錢升級模型,也能榨出模型潛藏的能力與應有的穩定度,這就是 Prompt Engineering 要做的。

三種角色

回頭看 Day 2 那支最小範例,messages 陣列裡每個元素都有一個 role。目前為止我們只用過 user,但完整的角色其實有三種:

  • system:設定模型的「行為準則」——它該扮演什麼角色、遵守什麼規則、用什麼語氣回答,是整段對話都要遵守的規則。
  • user:使用者實際說的話,也就是每一輪對話裡「向模型提問的內容」。
  • assistant:模型之前的回覆。多輪對話時,要把歷史紀錄組成 assistant 訊息,一併送回去,模型才「記得」前面說過什麼——它本身沒有記憶,每次呼叫都是全新的。

system 跟 user 有什麼不一樣

很多人第一次寫 prompt 會把所有東西都塞進 user 訊息裡,例如「你是一個客服助理,只能用繁體中文回答,語氣要親切,現在請回答:退貨政策是什麼」。這樣能動沒錯,但有個問題:如果同一個對話裡使用者問了三個問題,就得在每一句話前面重複貼一次「你是客服助理⋯⋯」這段設定。

把「角色設定、規則」放進 system,把「這次實際要問的事」放進 user,是比較乾淨的做法——system 只需要設定一次,之後每一輪對話都自動套用,不用重複貼。

程式範例:多輪對話

import os
import anthropic

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    system="你是一個客服助理,只能用繁體中文回答,語氣親切、簡潔。",
    messages=[
        {"role": "user", "content": "退貨政策是什麼?"},
        {"role": "assistant", "content": "商品到貨 7 天內可以申請退貨,商品需保持全新未拆封狀態。"},
        {"role": "user", "content": "那運費誰付?"},
    ],
)

print(response.content[0].text)

這裡的 messages 陣列裡放了一輪完整的「歷史」——使用者問過的話跟模型回過的話都在,最後才加上這次新的問題。模型會根據這整段歷史來回答「那運費誰付」,而不是把它當成一個孤立的問題。

值得一提的是,system 在 Anthropic 的 SDK 裡是一個獨立參數,不是塞進 messages 陣列裡的;有些廠商的 SDK(例如 OpenAI)則是把 system 也當成 messages 裡的一個角色({"role": "system", "content": "..."})。

今日小結

透過 Prompt 中的結構來設定角色,是最簡單規範模型的做法。已經了解最基本 Prompt 設定後,明天我們要來探討:給模型看過範例再做,跟讓它直接做,結果會差多少?


上一篇
Day 05:錯誤處理與重試機制
下一篇
Day 07:Zero-shot vs Few-shot:要不要先給模型看範例?
系列文
從呼叫 API 到打造 Gateway:LLM 工程化 30 天22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言